package com.xie.leetcode.array;

//661. 图片平滑器
//        包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ，平均灰度的计算是周围的8个单元和它本身的值求平均，如果周围的单元格不足八个，则尽可能多的利用它们。
//
//        示例 1:
//
//        输入:
//        [[1,1,1],
//        [1,0,1],
//        [1,1,1]]
//        输出:
//        [[0, 0, 0],
//        [0, 0, 0],
//        [0, 0, 0]]
//        解释:
//        对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
//        对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
//        对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
//        注意:
//
//        给定矩阵中的整数范围为 [0, 255]。
//        矩阵的长和宽的范围均为 [1, 150]。

import java.util.Arrays;

/**
 * @author xiezhendong
 * @date 2021/12/1
 */
public class ImageSmoother {

    public static void main(String[] args) {
        ImageSmoother imageSmoother = new ImageSmoother();
        System.out.println(Arrays.toString(imageSmoother.imageSmoother(new int[][]{new int[]{2, 3, 4}, new int[]{5, 6, 7}, new int[]{8, 9, 10}, new int[]{11, 12, 13}, new int[]{14, 15, 16}})));
        System.out.println(Arrays.toString(imageSmoother.imageSmoother(new int[][]{new int[]{1, 1, 1}, new int[]{1, 0, 1}, new int[]{1, 1, 1}})));
    }

    public int[][] imageSmoother(int[][] img) {
        int row = img.length;
        int cel = img[0].length;
        int[][] imgNew = new int[row][cel];
        for (int r = 0; r < row; ++r) {
            for (int c = 0; c < cel; ++c) {
                int count = 0;
                int sum = imgNew[r][c];
                for (int nr = r - 1; nr <= r + 1; ++nr) {
                    for (int nc = c - 1; nc <= c + 1; ++nc) {
                        if (0 <= nr && nr < row && 0 <= nc && nc < cel) {
                            sum += img[nr][nc];
                            count++;
                        }
                    }
                }
                imgNew[r][c] = sum / count;
            }
        }
        return imgNew;
    }
}
